package com.winit.common.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 压缩工具
 * Created by wangjian on 16/9/22.
 */
public class ZipUtil {

    private static final Logger logger = LoggerFactory.getLogger(ZipUtil.class);

    /**
     * 文件分隔符
     */
    private static String FILE_SEPARATOR= "/";

    /**
     * 压缩
     * @param outfile 输出
     * @param infile 输入 要压缩的文件列表
     * @return boolean 成功：TRUE 失败：FALSE
     */
    public static boolean zip(String outfile, String infile) throws Exception{
        try {
            File outFile = new File(outfile);
            if(!outFile.getParentFile().exists()) {
                outFile.getParentFile().mkdirs();
            }
            if(outFile.exists()) {
                outFile.delete();
            }
            // 文件输出流
            FileOutputStream fout = new FileOutputStream(outfile);
            // zip文件输出流
            ZipOutputStream out = new ZipOutputStream(fout);
            // 要打包的文件
            File file = new File(infile);
            // 进行打包zip操作,第一次打包不指定文件夹,因为程序接口中指定了一级文件夹
            zip2(out, file, "");
            // 关闭zip输出流
            out.close();
            // 返回成功
            return true;
        } catch (FileNotFoundException e) {
            logger.error("打包失败(指定的文件不存在)...",e);
            return false;
        } catch (Exception e) {
            logger.error("打包失败(未知原因)...",e);
            return false;
        }
    }

    /**
     * 压缩 递归
     * @param out 输出流
     * @param file 输入
     * @param dir 压缩的文件夹
     * @throws Exception Exception
     */
    private static void zip2(ZipOutputStream out, File file, String dir)
            throws Exception {
        // 如果当前打包的是目录
        if (file.isDirectory()) {
            // 输出进度信息
            logger.info("当前正在打包文件夹:" + file);
            // 文件列表
            File[] files = file.listFiles();
            // 添加下一个打包目录文件
            if(!StringUtils.isEmpty(dir)){
                out.putNextEntry(new ZipEntry(dir + FILE_SEPARATOR));
            }
            //
            String dirTemp = dir.length() == 0 ? "" : dir + FILE_SEPARATOR;
            for (int i = 0; i < files.length; i++) {
                zip2(out, files[i], dirTemp + files[i].getName());
            }
        }
        // 如果当前打包文件
        else {
            if(file.getName().endsWith(".desc")){
                return;
            }
            // 输出进度信息
            logger.info("当前正在打包文件:" + file);
            //
            out.putNextEntry(new ZipEntry(dir));
            // 文件输入流
            FileInputStream in = new FileInputStream(file);
            int i;
            // 进行写入
            while ((i = in.read()) != -1) {
                out.write(i);
            }
            // 关闭输入流
            in.close();
        }

    }

    public static void main(String[] args) throws Exception {
        ZipUtil.zip("/Users/wangjian/Downloads/sql.zip"
                ,"/mnt/beetle/projects/beetle-test/beetle-test");
    }
}
